AWS CloudFormation/AWS SAMのテンプレートをJSON Schemaでリアルタイムバリデーションする
こんにちは、CX事業本部 IoT事業部の若槻です。
今回は、AWS CloudFormationおよびAWS SAMのテンプレートのJSON Schemaによるリアルタイムバリデーションを試してみました。
前提
Visual Studio Codeでテンプレートの編集を行う前提とします。
JSON Schemaとは
JSON Schemaとは、JSON(YAML)ドキュメントのアノテーションやバリデーションの規格を行うオープンソースプロジェクトです。
JSON Schema is a vocabulary that allows you to annotate and validate JSON documents.
JSON Schemaでは様々な様々なドキュメントの規格に対応しており、対応ドキュメントの一覧は下記で確認可能です。
GitHub Repositoryでなら下記からも確認できます。
やってみた
Json Schemaの導入
下記のYAMLというExtensionをVS Codeにインストールするだけです。
提供はRed Hat社のようですね。
YAMLではJSON Schemaをサポートしており、導入すると対応しているドキュメントで自動的に利用可能となります。
使用しているドキュメントがJSON Schemaに対応している場合は、ファイル上部に下記のようなリンクが表示されます。
これをクリックして開くとJSON Schemeのソースを確認することができます。
CloudFormationテンプレートのバリデーション
CloudFormationテンプレートのJSON Schemaのソースは下記となります。バリデーション対象となるファイル名や、ソースのURLが確認できます。
{ "name": "AWS CloudFormation", "description": "AWS CloudFormation provides a common language for you to describe and provision all the infrastructure resources in your cloud environment.", "fileMatch": [ "*.cf.json", "*.cf.yml", "*.cf.yaml", "cloudformation.json", "cloudformation.yml", "cloudformation.yaml" ], "url": "https://raw.githubusercontent.com/awslabs/goformation/master/schema/cloudformation.schema.json" },
次のようなCloudFormationテンプレートで確認してみます。
AWSTemplateFormatVersion: "2010-09-09" Description: A sample template Resources: MyEC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: "ami-0ff8a91507f77f867" InstanceType: t2.micro KeyName: testkey BlockDeviceMappings: - DeviceName: /dev/sdm Ebs: VolumeType: io1 Iops: 200 DeleteOnTermination: false VolumeSize: 20
必須プロパティを指定しない場合はバリデーションエラーとなります。
赤波線にマウスオーバーすると、アノテーションを確認することもできます。これによりバリデーションエラーの内容が分かります。
リソース名が重複した時もバリデーションエラーとなります。
プロパティで使用できない値を指定した時もバリデーションエラーとなります。
プロパティで指定できない型の値を指定した場合もバリデーションエラーとなります。
SAMテンプレートのバリデーション
SAMテンプレートのJSON Schemaのソースは下記となります。
{ "name": "AWS CloudFormation Serverless Application Model (SAM)", "description": "The AWS Serverless Application Model (AWS SAM, previously known as Project Flourish) extends AWS CloudFormation to provide a simplified way of defining the Amazon API Gateway APIs, AWS Lambda functions, and Amazon DynamoDB tables needed by your serverless application.", "fileMatch": [ "serverless.template", "*.sam.json", "*.sam.yml", "*.sam.yaml", "sam.json", "sam.yml", "sam.yaml" ], "url": "https://raw.githubusercontent.com/awslabs/goformation/master/schema/sam.schema.json" },
次のようなSAMテンプレートで確認してみます。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Sample SAM Template for sam-app Globals: Function: Timeout: 3 Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello_world/ Handler: app.lambda_handler Runtime: python3.8 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get
バリデーションの行われ方はCloudFormationの場合と基本的に同じです。
下記は必須プロパティが無い場合のバリデーションエラーです。
参考
- VS CodeでJSON Schemaを使ったらCircleCI Configの編集がすごく楽になった | DevelopersIO
- AWS再入門2022 AWS Serverless Application Model (AWS SAM)編 | DevelopersIO
以上